/**
 * 数据 按照 拼音首字母 排序 并分组
 * 
 * @param {Json} data ; 需要 排序的 数据
 * @param {String} field ；必须；排序所依据的 字段 名
 * 
 * @return {Json} ; 例如：{A:[{},{}],B:[{},{}],C:[{}],#:[]}
**/
function data_letter_sort (data, field) {
    var letter_reg = /^[A-Z]$/;
    var list = new Array();
    for (var i = 0; i < data.length; i++) {
        // 首字母 转 大写英文
        var letter = (data[i][field]).substr(0, 1).toUpperCase();

        // 是否 大写 英文 字母
        if (!letter_reg.test(letter)) {
            letter = '#';
        }
        // 创建 字母 分组
        if (!(letter in list)) {
            list[letter] = new Array();
        }
        // 字母 分组 添加 数据
        list[letter].push(data[i]);
    }

    // 转换 格式 进行 排序；
    var resault = new Array();
    for (var key in list) {
        resault.push({
            letter: key,
            list: list[key]
        });
    }
    resault.sort(function (x, y) {
        return x.letter.charCodeAt(0) - y.letter.charCodeAt(0);
    });
    // # 号分组 放最后
    var last_arr = resault[0];
    resault.splice(0, 1);
    resault.push(last_arr);

    // 转换 数据 格式
    var json_sort = {}
    for (var i = 0; i < resault.length; i++) {
        json_sort[resault[i].letter] = resault[i].list;
    }
    return json_sort;
}

//防止重复点击，1秒半间隔后可重新点击
function banManyClick (em) {
    if (em.isPost) {
        em.$toast('请勿重复提交');
        return false;
    }
    em.isPost = true;
    setTimeout(() => {
        em.isPost = false;
    }, 1500);
    return true;
}

//通用校验保存
function formValid (that, formName, saveFn) {
  that.$refs[formName].validate(valid => {
    if (valid) {
      if(that.ISPOST) {
        that.$message({
          message: '操作太频繁！',
          type: 'warning',
        });
        // return true;
      }
      if (!that.ISPOST) {
        saveFn()
      }
      that.ISPOST = true;
      setTimeout(() => {
        that.ISPOST = false;
      }, 3000);
    } else {
      that.$message({
        message: '请输入必填项!',
        type: 'warning'
      });
    }
  });
}

//-连接的字符串变为驼峰命名
function transformStr(str){
  var re=/-(\w)/g;
  return str.replace(re,function ($0,$1){
    return $1.toUpperCase();
  });
}

//首字母致为小写
function titleCase(str) {
  var newarr,newarr1=[];
  newarr = str.split(" ");
  for(var i = 0 ; i < newarr.length ; i++){
    newarr1.push(newarr[i][0].toLowerCase()+newarr[i].substring(1));
  }
  return newarr1.join(' ');
}

// 函数防抖
const debounce = (fn, delay) => {
  let times = delay || 200
  let timer
  return function () {
      let _this = this
      let args = arguments
      timer && clearTimeout(timer)
      timer = setTimeout(function () {
          timer = null
          fn.apply(_this, args)
      }, times)
  }
}

/**
 * 保存
 * @param  {Blob} blob
 * @param  {String} filename 想要保存的文件名称
 */
 function saveAs(blob, filename) {
	if (window.navigator.msSaveOrOpenBlob) {
		navigator.msSaveBlob(blob, filename);
	} else {
		var link = document.createElement('a');
		var body = document.querySelector('body');

		link.href = window.URL.createObjectURL(blob);
		link.download = filename;
		// fix Firefox
		link.style.display = 'none';
		body.appendChild(link);
		link.click();
		body.removeChild(link);
		window.URL.revokeObjectURL(link.href);
	};
}

/**
 * 获取 blob
 * @param  {String} url 目标文件地址
 * @return {cb}
 */
 function getBlob(url,cb) {
	var xhr = new XMLHttpRequest();
	xhr.open('GET', url, true);
	xhr.responseType = 'blob';
	xhr.onload = function() {
		if (xhr.status === 200) {
			cb(xhr.response);
		}
	};
	xhr.send();
}

// 阿里云
function downloadNormalFile(url, filename){
	getBlob(url, function(blob) {
		saveAs(blob, filename);
	});
}

function downloadFile(url, filename) {
  if(!filename){
    let index = url.lastIndexOf('/')
    filename = url.substr(index+1)
  }
  let a = document.createElement('a');
    a.style.display = 'none';
    a.download = 'fileName';
    a.href = url;
    a.setAttribute('download', filename);
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
}



export {
  data_letter_sort,
  banManyClick,
  formValid,
  transformStr,
  titleCase,
  debounce,
  downloadNormalFile,
  downloadFile
};
